home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / net / bind-contrib.tar.gz / bind-contrib.tar / contrib / hostmaint / ndrev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-25  |  4.1 KB  |  175 lines

  1. /*
  2.  *    Ndrev    Takes a standard "NAMED" file and creates "reverse" (PTR)
  3.  *        entries from each host (IN A) entry.
  4.  *
  5.  *    Calling sequence:
  6.  *
  7.  *        ndrev NETWORK -d DOMAIN [FILE]
  8.  *
  9.  *    where:    NETWORK    is the class a, b, or c network or subnetwork
  10.  *            number to reverse.  All entries not belonging
  11.  *            to this network will be ignored.
  12.  *
  13.  *        DOMAIN    is the root domain of the NAMED file being processed.
  14.  *
  15.  *        FILE    is the source file name.  Default is standard input.
  16.  *
  17.  *    Written by Douglas E. Nelson, Michigan State University
  18.  *
  19.  *    Copyright, 1989, Michigan State University Board of Trustees
  20.  */
  21.  
  22. #include <stdio.h>
  23. #include <sys/types.h>
  24. #include <sys/stat.h>
  25.  
  26. gotoeol(f) register FILE *f; { 
  27.   register char ch; 
  28.   do ch=getc(f); while(ch!='\n' && ch!=EOF); 
  29.   if (ch==EOF) return(EOF);
  30.   else return(0); 
  31.  
  32. /* subroutine:  no case string compare(str1,str2) 
  33. * compares two strings ignoring alphabetic case 
  34. * returns NULL if they are equal 
  35. */ 
  36. int ncstrcmp(str1,str2) register unsigned char *str1,*str2; { 
  37.   register unsigned char ch1,ch2; 
  38.   if (str1==str2) return(0); 
  39.   if (str1==NULL || str2==NULL) return(1); 
  40.   while (*str1!=NULL && *str2!=NULL) { 
  41.     ch1= *str1>='A'&&*str1<='Z'?*str1++|32:*str1++; 
  42.     ch2= *str2>='A'&&*str2<='Z'?*str2++|32:*str2++; 
  43.     if (ch1!=ch2) return(1); 
  44.   } 
  45.   if (*str1!=NULL || *str2!=NULL) return(-1); 
  46.   return(0); 
  47.  
  48.  
  49. main(argc,argv) int argc; char *argv[];
  50.   FILE *f; 
  51.   char ch; 
  52.   int hm; 
  53.   int i;
  54.   char name[80],instr[80],instr2[80],adrs[80],deptname[80]; 
  55.   int a1, a2, a3, a4;
  56.   int nadr = 0;
  57.   int adr1, adr2, adr3, adr4;
  58.  
  59.   deptname[0]='\0';
  60.  
  61.   f = stdin;
  62.   while (--argc)  {
  63.     ++argv;
  64.     if (**argv >= '0' && **argv <= '9') {
  65.       nadr = sscanf (*argv,"%d.%d.%d.%d",&adr1,&adr2,&adr3,&adr4);
  66.       if (!nadr) {
  67.     fprintf (stderr, "Unknown argument: %s\n",*argv);
  68.     exit (-1);
  69.       }
  70.       if (nadr > 3) {
  71.     fprintf (stderr, "Cannot reverse a single host\n");
  72.     exit (-1);
  73.       }
  74.     } else if (strcmp(*argv,"-d") == 0) {
  75.       if (--argc < 1) {
  76.     fprintf (stderr, "Domain name argument missing for -d\n");
  77.     exit (-1);
  78.       }
  79.       strcpy (deptname, *++argv);
  80.       strcat (deptname, ".");
  81.     } else {
  82.       f=fopen(*argv,"r"); 
  83.       if (f==0) {
  84.     fprintf (stderr, "Unable to open file: %s\n",*argv);
  85.     exit (-2);
  86.       }
  87.     }
  88.   }
  89.  
  90.   if (!nadr) {
  91.     fprintf (stderr, "Must specify the (sub)network to reverse, e.g. 35.8\n");
  92.     exit (-1);
  93.   }
  94.  
  95.   fprintf (stdout, "$ORIGIN\t");
  96.   if (nadr > 2)  fprintf (stdout, "%d.",adr3);
  97.   if (nadr > 1)  fprintf (stdout, "%d.",adr2);
  98.   fprintf (stdout, "%d.IN-ADDR.ARPA.\n",adr1);
  99.  
  100.   name[0] = '\0';
  101.   do { 
  102.     do ch=getc(f); while (ch=='\n' && ch!=EOF); 
  103.     if (ch>='A' && ch<='Z' || ch >='a' && ch <= 'z' || 
  104.     ch >= '0' && ch <= '9' || ch == '@' || ch == ' ' || ch == '\t') {
  105.       ungetc(ch,f); 
  106.       if (ch == ' ' || ch == '\t') {
  107.     hm = 1; 
  108.       } else {
  109.     hm=fscanf(f,"%s",name); 
  110.       }
  111.       if (hm == 1) {
  112.     do ch = getc(f); while (ch==' ' || ch == '\t');
  113.     if (ch >= '0' && ch <= '9') {
  114.       ungetc(ch,f);
  115.       fscanf(f,"%s",instr);
  116.     } else {
  117.       ungetc(ch,f);
  118.     }
  119.     hm=fscanf(f,"%s %s %s",instr,instr2,adrs) + 1; 
  120.       }
  121.       ch = gotoeol(f);
  122.       if (hm>=4 && ((ncstrcmp("IN",instr)==NULL) &&
  123.       ((ncstrcmp("A",instr2)==NULL) || (ncstrcmp("SA",instr2)==NULL)))) {
  124.     sscanf (adrs,"%d.%d.%d.%d",&a1,&a2,&a3,&a4);
  125.     if (a1 == adr1 && (nadr < 2 || a2 == adr2) &&
  126.         (nadr < 3 || a3 == adr3)) {
  127.       fprintf(stdout,"%d",a4);
  128.       if (nadr < 3) fprintf(stdout,".%d",a3);
  129.       if (nadr < 2) fprintf(stdout,".%d",a2);
  130.       fprintf(stdout,"\tIN\tPTR\t");
  131.       if (strcmp("@",name) == 0) {
  132.         fprintf(stdout,"%s",deptname);
  133.       } else {
  134.         fprintf(stdout,"%s",name);
  135.         if (strlen(deptname)>0 && name[strlen(name)-1] != '.')
  136.           fprintf(stdout,".%s",deptname);
  137.       }
  138.       putc('\n',stdout);
  139.     }
  140.       }
  141.     } else { 
  142.       switch (ch) {
  143.     case '$': {
  144.       fscanf(f,"%s %s",instr,instr2);
  145.       ch=gotoeol(f);
  146.       if (ncstrcmp("ORIGIN",instr)==NULL) {
  147.         strcpy(deptname,instr2);
  148.         name[0] = '\0';
  149.       }
  150.       break;
  151.     }
  152. /*
  153.     case ';': {
  154.       putc(ch,stdout);
  155.       while (ch!='\n' && ch!=EOF) {
  156.         ch=getc(f);
  157.         putc(ch,stdout);
  158.       }
  159.       break;
  160.     }
  161. */
  162.     default: {
  163.       ch=gotoeol(f);
  164.       break;
  165.     }
  166.       }
  167.     }
  168.   } while (ch!=EOF); 
  169.   fclose(f);
  170.   return(0); 
  171.